home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / pc / files / t_unix / bs941029.tgz / bbsx-941029.tar / bbsx / killdup.c < prev    next >
C/C++ Source or Header  |  1994-10-29  |  7KB  |  242 lines

  1. #ifndef __lint
  2. static char rcsid[] = "@(#) $Header: /home/dg1rtf/tcp/bbsx/RCS/killdup.c,v 1.1 1994/06/01 22:21:32 dg1rtf Exp $";
  3. #endif
  4.  
  5. #define _HPUX_SOURCE
  6.  
  7. #include <sys/types.h>
  8.  
  9. #include <stdio.h>
  10.  
  11. #include <fcntl.h>
  12. #include <pwd.h>
  13. #include <stdlib.h>
  14. #include <time.h>
  15. #include <unistd.h>
  16.  
  17. #include "bbs.h"
  18. #include "bbs.hd"
  19.  
  20. #define SAVETIME (7*24*60*60)
  21.  
  22. struct vitals {
  23.   unsigned short len;
  24.   unsigned short sum;
  25.   unsigned short crc;
  26. };
  27.  
  28. static FILE *fpbbs;
  29. static const char *datafile = "killdup_data";
  30. static const char *tempfile = "killdup_temp";
  31. static int delmesg;
  32. static int firstmesg;
  33. static int lastmesg;
  34. static int savemesg;
  35. static struct vitals *vitals;
  36. const struct cmdtable cmdtable[1];
  37.  
  38. /* In killdup.c: */
  39. static int getvitals(int n);
  40. static void delete_mesg(int n);
  41. int main(void);
  42.  
  43. /*---------------------------------------------------------------------------*/
  44.  
  45. static const unsigned short crc_table[] = {
  46.   0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241,
  47.   0xc601, 0x06c0, 0x0780, 0xc741, 0x0500, 0xc5c1, 0xc481, 0x0440,
  48.   0xcc01, 0x0cc0, 0x0d80, 0xcd41, 0x0f00, 0xcfc1, 0xce81, 0x0e40,
  49.   0x0a00, 0xcac1, 0xcb81, 0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841,
  50.   0xd801, 0x18c0, 0x1980, 0xd941, 0x1b00, 0xdbc1, 0xda81, 0x1a40,
  51.   0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41,
  52.   0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641,
  53.   0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081, 0x1040,
  54.   0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240,
  55.   0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441,
  56.   0x3c00, 0xfcc1, 0xfd81, 0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41,
  57.   0xfa01, 0x3ac0, 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840,
  58.   0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41,
  59.   0xee01, 0x2ec0, 0x2f80, 0xef41, 0x2d00, 0xedc1, 0xec81, 0x2c40,
  60.   0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640,
  61.   0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041,
  62.   0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, 0x6240,
  63.   0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441,
  64.   0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41,
  65.   0xaa01, 0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840,
  66.   0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41,
  67.   0xbe01, 0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40,
  68.   0xb401, 0x74c0, 0x7580, 0xb541, 0x7700, 0xb7c1, 0xb681, 0x7640,
  69.   0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041,
  70.   0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241,
  71.   0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, 0x5440,
  72.   0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40,
  73.   0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841,
  74.   0x8801, 0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40,
  75.   0x4e00, 0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41,
  76.   0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641,
  77.   0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040
  78. };
  79.  
  80.  
  81. /*---------------------------------------------------------------------------*/
  82.  
  83. static int getvitals(int n)
  84. {
  85.  
  86.   FILE * fp;
  87.   char *p;
  88.   char *q;
  89.   char buf[1024];
  90.   char filename[1024];
  91.   int c;
  92.   struct vitals *v;
  93.  
  94.   v = vitals + n;
  95.   v->len = v->sum = v->crc = 0;
  96.   strcpy(filename,getfilename(n));
  97.   if (!(fp = fopen(filename, "r"))) return 0;
  98.   while (fgets(buf, sizeof(buf), fp)) {
  99.     p = q = buf;
  100.     while ((c = (*p++ & 0x7f)) != 0)
  101.       if (c > ' ' && c < 0x7f) *q++ = c;
  102.     *q = '\0';
  103.     if (!*buf) continue;
  104.     if (buf[0] == 'R' && buf[1] == ':') continue;
  105.     for (p = buf; *p; p++) {
  106.       v->len++;
  107.       v->sum += (*p & 0xff);
  108.       v->crc = (v->crc >> 8) ^ crc_table[(v->crc ^ *p) & 0xff];
  109.     }
  110.   }
  111.   fclose(fp);
  112.   return 1;
  113. }
  114.  
  115. /*---------------------------------------------------------------------------*/
  116.  
  117. static void delete_mesg(int n)
  118. {
  119.   if (n > delmesg) {
  120.     if (savemesg >= n) savemesg = n - 1;
  121.     return;
  122.   }
  123.   if (!fpbbs) {
  124.     fpbbs = popen("exec bbs", "w");
  125.     if (!fpbbs) halt();
  126.   }
  127.   fprintf(fpbbs, "delete %d\n", n);
  128.   fflush(fpbbs);
  129.   vitals[n].len = vitals[n].sum = vitals[n].crc = 0;
  130. }
  131.  
  132. /*---------------------------------------------------------------------------*/
  133.  
  134. int main(void)
  135. {
  136.  
  137.   FILE * fp1;
  138.   FILE * fp;
  139.   char buf[1024];
  140.   char filename[1024];
  141.   char host[1024];
  142.   int fd;
  143.   int fdindex;
  144.   int i;
  145.   int j;
  146.   int vsize;
  147.   long timelimit;
  148.   struct index index;
  149.   struct passwd *pw;
  150.   struct vitals *vi;
  151.   struct vitals *vj;
  152.  
  153.   if (getuid()) {
  154.     pw = getpwnam(bbsadm);
  155.     if(getuid() != pw->pw_uid) {
  156.       perror("permission denied");
  157.       return 1;
  158.     }
  159.   }    
  160.  
  161.   if (chdir(WRKDIR)) {
  162.     mkdir(WRKDIR, 0755);
  163.     if(chdir(WRKDIR)) halt();
  164.   }  
  165.  
  166.   read_config();
  167.  
  168.  
  169.   if ((fdindex = open(INDEXFILE, O_RDONLY, 0644)) < 0) halt();
  170.   if (lseek(fdindex, -sizeof(index), SEEK_END) < 0) halt();
  171.   if (read(fdindex, (char *) &index, sizeof(index)) != sizeof(index))
  172.     halt();
  173.   lastmesg = savemesg = delmesg = index.mesg;
  174.  
  175.   vsize = (lastmesg + 1) * sizeof(*vitals);
  176.   if (!(vitals = malloc(vsize))) halt();
  177.  
  178.   firstmesg = 1;
  179.   if ((fd = open(datafile, O_RDONLY, 0644)) >= 0) {
  180.     firstmesg = read(fd, (char *) vitals, vsize) / sizeof(*vitals);
  181.     if (firstmesg < 1) firstmesg = 1;
  182.     close(fd);
  183.   }
  184.   if (firstmesg > lastmesg) return 0;
  185.  
  186.   if (!(fp = fopen(CONFIGFILE, "r"))) halt();
  187.   while (fgets(buf, sizeof(buf), fp))
  188.     strlwc(buf);
  189.     if (sscanf(buf, "mbox:%s", host) == 1 && (pw = getpwnam(host)) != NULL) {
  190.       sprintf(filename, "%s/" SEQFILE, pw->pw_dir);
  191.       if (!(fp1 = fopen(filename, "r"))) halt();
  192.       if (fscanf(fp1, "%d", &i) == 1 && i < delmesg) delmesg = i;
  193.       fclose(fp1);
  194.     }
  195.   endpwent();
  196.   fclose(fp);
  197.  
  198.   timelimit = time(NULL) - SAVETIME;
  199.   if (lseek(fdindex, -sizeof(index), SEEK_END) < 0) halt();
  200.   for (; ; ) {
  201.     if (read(fdindex, (char *) &index, sizeof(index)) != sizeof(index))
  202.       halt();
  203.     if (index.mesg < delmesg) break;
  204.     if (index.date < timelimit) {
  205.       delmesg = index.mesg;
  206.       break;
  207.     }
  208.     if (lseek(fdindex, -2 * sizeof(index), SEEK_CUR) < 0) break;
  209.   }
  210.  
  211.   for (i = firstmesg; i <= lastmesg; i++)
  212.     if (getvitals(i)) {
  213.       vi = vitals + i;
  214.       if (!vi->len && !vi->sum && !vi->crc)
  215.     delete_mesg(i);
  216.       else
  217.     for (j = 1; j < i; j++) {
  218.       vj = vitals + j;
  219.       if (vi->len == vj->len && vi->sum == vj->sum && vi->crc == vj->crc)
  220.         delete_mesg(j);
  221.     }
  222.     }
  223.  
  224.   if (savemesg >= firstmesg) {
  225.     vsize = (savemesg + 1) * sizeof(*vitals);
  226.     if ((fd = open(tempfile, O_WRONLY | O_CREAT | O_TRUNC, 0644)) < 0)
  227.       halt();
  228.     if (write(fd, (char *) vitals, vsize) != vsize) halt();
  229.     close(fd);
  230.     if (rename(tempfile, datafile)) halt();
  231.   }
  232.  
  233.   if (fpbbs) {
  234.     fprintf(fpbbs, "quit\n");
  235.     fflush(fpbbs);
  236.     pclose(fpbbs);
  237.   }
  238.  
  239.   return 0;
  240. }
  241.  
  242.